package com.mycode.adapter07;

/**
 * 适配器模式有：对象适配器模式、类适配器模式（不常用）、双向适配器模式（model包模型）、缺省适配器模式（model2包模型）
 * 主要优点：
 *     1、目标类和适配者类解耦，通过引用一个适配器类来重用现有的适配者类，无需修改原有结构
 *     2、增加了类的透明性和复用性，将具体的业务实现过程封装在适配者类中，提高了适配者类的复用性、同一个适配者类可以在多个不同的系统中复用
 *     3、灵活性和扩展性较好，通过配置文件，可以更换适配器，也可以在不修改原有代码的基础上增加适配器类，完全符合开闭原则
 *   对象适配器模式还有以下优点：
 *     1、一个对象适配器可以把多个不同的适配者适配到同一个目标
 *     2、可以适配一个适配者的子类，由于适配器和适配者之间是关联关系，根据里氏代换原则，适配者的子类也可通过该适配器进行适配
 *
 * 主要缺点：
 *     1、对于Java 不支持多重类继承的语言，一次最多只能适配一个适配者类，不能同时适配多个适配者
 *     2、适配者类不能为最终类
 *     3、在Java总中，类适配器模式中的目标抽象类只能为接口，不能为类，器使用有一定的局限性
 *   对象适配器模式的缺点是：与类适配器模式相比，要比适配器中置换适配者类的某些方法比较麻烦。如果一定要置换掉适配者类的一个或多个方法，
 *   可以先做一个适配者类的子类，在子类中将适配者类的方法置换掉，然后再把适配者类的子类当做真正的适配者进行适配，实现过程较为复杂
 *
 * 使用场景：
 *     1、系统需要使用一些现有的类，这些类的接口（或方法名）不符合系统的需要，甚至没有这些类的源代码
 *     2、想创建一个可以重复使用的类，用于与一些彼此之间没有太大关联的类，包括一些可能在将来引进的类一起工作
 */
public class Bootstrap {

    public static void main(String[] args) {
        ScoreOperation operation = new OperationAdapter();
        int[] scores = {84, 76, 50, 69, 90, 91, 88, 96};
        int[] result;
        int score;
        System.out.println("成绩排序结果：");
        result = operation.sort(scores);

        for (int i : result) {
            System.out.print(i + ",");
        }
        System.out.println();
        System.out.println("查找成绩90：");
        score = operation.search(result, 90);
        if (score != -1) {
            System.out.println("找到成绩90");
        }
        else {
            System.out.println("没有找到成绩90");
        }
        System.out.println("查找成绩92：");
        score = operation.search(result, 92);
        if (score != -1) {
            System.out.println("找到成绩92");
        }
        else {
            System.out.println("没有找到成绩92");
        }
    }
}
